package cl.duocap.refaxion.dao;


import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import cl.duocap.refaxion.dto.TipoUsuarioDTO;
import cl.duocap.refaxion.dto.UsuarioDTO;

import java.sql.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.*;

public class UsuarioDAO {
	
	 private Connection conexion;
	
	 public UsuarioDTO autenticarUsuario(String usuario, String password){
	        
	        UsuarioDTO usuarioAutenticado = new UsuarioDTO();
	        ResultSet rset= null;
	        
	        try {

	    		CallableStatement cstmt = conexion.prepareCall("{ call paConClinicaIsinUsuario(?,?)}");
	    		int i = 1;
				cstmt.setString(i++, usuario);
				cstmt.setString(i++, password);
				rset = cstmt.executeQuery();

	    		
	    		while (rset.next()){
					
	    			
	    			usuarioAutenticado.setIdUsuario(rset.getInt("idUsuario"));
	    			usuarioAutenticado.setRut(rset.getString("rut"));
	    			usuarioAutenticado.setNombre(rset.getString("nombre"));
	    			usuarioAutenticado.setApellidoPaterno(rset.getString("apellidoPaterno"));
	    			usuarioAutenticado.setApellidoPaterno(rset.getString("apellidoMaterno"));
	    			usuarioAutenticado.setTipoUsuarioDescripcion(rset.getString("tipoUsuarioDescripcion"));
	    			usuarioAutenticado.setIdTipoUsuario(rset.getInt("idTipoUsuario"));

				}
	    		
      
	            
	        } catch (SQLException ex) {
	             throw new RuntimeException("Autenticar Usuario.",ex);                    
	        }finally {
	             try{
	                rset.close();
	                conexion.close();
	            }catch (Exception ex){
	                
	            }
	            try{
	            	rset.close();
	                conexion.close();
	            }catch (Exception ex){
	                
	            }
	            
	        }
	        return usuarioAutenticado;

	    }

	public boolean registrarUsuarioNuevo(UsuarioDTO usuarioNuevo){
		
		try {
			
		
				CallableStatement cstmt = conexion.prepareCall("{ call paInsClinicaIsinRegistrarUsuario(?,?,?,?,?,?,?,?,?,?,?,?)}");
		
				int i = 1;
				
				cstmt.setString(i++,usuarioNuevo.getRut());
				cstmt.setString(i++,usuarioNuevo.getNombre());
				cstmt.setString(i++,usuarioNuevo.getApellidoPaterno());
				cstmt.setString(i++,usuarioNuevo.getApellidoMaterno());
				cstmt.setString(i++,usuarioNuevo.getTelefono());
				cstmt.setString(i++,usuarioNuevo.getDireccion());
				cstmt.setString(i++,usuarioNuevo.getFechaIngreso());
				cstmt.setString(i++,usuarioNuevo.getUsuario());
				cstmt.setString(i++,usuarioNuevo.getPassword());
				cstmt.setInt(i++,2);
				cstmt.setInt(i++,1);
				cstmt.setString(i++,usuarioNuevo.getEmail());
				
				
				/*cstmt.setInt(i++,usuarioNuevo.getTipoUsuario());
				cstmt.setInt(i++,usuarioNuevo.getEstado());*/
				
				cstmt.executeUpdate();
				cstmt.close();
				
				return true;
				
		
		
		 } catch (SQLException ex) {
             throw new RuntimeException("registrar usuario.",ex);     
            
        }finally {
             try{
            	 conexion.close();
            }catch (Exception ex){
                
            }
            try{
                conexion.close();
            }catch (Exception ex){
            	 return false;
            }
            
        }
		
	}
	
	
	public List<TipoUsuarioDTO> listarTipoUsuario(){
		
		
		List<TipoUsuarioDTO> lista = new ArrayList<TipoUsuarioDTO>();
		
        PreparedStatement stmt = null;
        ResultSet rs= null;
        
		try {

	             String sql = ""
                      + "select * "
                      + "from TipoUsuario";
			     stmt = conexion.prepareStatement(sql);

			     rs = stmt.executeQuery();

	             while (rs.next()){
	                 
	            	 TipoUsuarioDTO tipoUsuario = new TipoUsuarioDTO(); 
	            	 tipoUsuario.setIdTipoUsuario(rs.getInt("idTipoUsuario"));
	            	 tipoUsuario.setTipoUsuarioDescripcion(rs.getString("tipoUsuarioDescripcion")); 	 
	            	 lista.add(tipoUsuario);

	             }

	        } catch (SQLException ex) {
	             throw new RuntimeException("error listar tipo de usuarios.",ex);                    
	        }finally {
	             try{
	                rs.close();
	            }catch (Exception ex){
	                
	            }
	            try{
	                stmt.close();
	                conexion.close();
	            }catch (Exception ex){
	                
	            }
	            
	        }
		
		return lista;
	}
	
	
	public boolean eliminarUsuario(int idUsuario){

			try {
				
				
				CallableStatement cstmt = conexion.prepareCall("{ call paUpdRefaxionEliminarUsuario(?)}");
				int i=1;
				cstmt.setInt(i++,idUsuario);
				cstmt.executeUpdate();
				cstmt.close();
				
			 } catch (SQLException ex) {
		         throw new RuntimeException("error eliminar usuarios.",ex);   
		         
		    }finally {
		         try{
		        	 conexion.close();
		        	 return false;
		        }catch (Exception ex){
		            
		        }
		        try{
		        	
		            conexion.close();
		            return false;
		        }catch (Exception ex){
		            
		        }
		        
		    }	
			return true;
				
	}
	
	
	public UsuarioDTO traerUsuarioEditar(int idusuario) {

		
		   ResultSet rset = null;
		   UsuarioDTO usuarioEditar = new UsuarioDTO();
		   
			try {
					
					
					CallableStatement cstmt = conexion.prepareCall("{ call paUpdRefaxionTraerUsuarioEditar(?)}");
					
					int i = 1;
					cstmt.setInt(i++,idusuario);
					rset = cstmt.executeQuery();
					TipoUsuarioDTO tipoUsuarioEditarDto = new TipoUsuarioDTO();
					while (rset.next()) {
						
						usuarioEditar = new UsuarioDTO();
						usuarioEditar.setIdUsuario(rset.getInt("idUsuario"));
						usuarioEditar.setRut(rset.getString("rut"));
						usuarioEditar.setNombre(rset.getString("nombre"));			
						usuarioEditar.setApellidoPaterno(rset.getString("apellidoPaterno"));
						usuarioEditar.setApellidoMaterno(rset.getString("apellidoMaterno"));
						usuarioEditar.setTelefono(rset.getString("telefono"));
						usuarioEditar.setDireccion(rset.getString("direccion"));
						usuarioEditar.setFechaIngreso(rset.getString("fechaIngreso"));
						usuarioEditar.setUsuario(rset.getString("usuario"));
						usuarioEditar.setPassword(rset.getString("password"));
						usuarioEditar.setEmail(rset.getString("email"));
				
						
						tipoUsuarioEditarDto.setIdTipoUsuario(rset.getInt("idTipousuario"));
						tipoUsuarioEditarDto.setTipoUsuarioDescripcion(rset.getString("tipoUsuarioDescripcion"));
						usuarioEditar.setTipoUsuarioDto(tipoUsuarioEditarDto);
					
					}
					cstmt.close();
				
				
				
			   } catch (SQLException ex) {
				   
			        throw new RuntimeException("error traer usuario editar.",ex);   
			        
				   }finally {
					   
				        try{
				       	 	  conexion.close();
				       	 
				           }catch (Exception ex){
				           
				           }
				           try{
				        		conexion.close();
				           
				        	   }catch (Exception ex){      
				        	   }
			       
				   	}

					 SimpleDateFormat formatoDelTexto = new SimpleDateFormat("dd-MM-yyyy");
					 String strFecha = usuarioEditar.getFechaIngreso();
					 Date fecha = null;
					 try {
		
					     fecha = formatoDelTexto.parse(strFecha);
		
					 } catch (ParseException ex) {
		
					     ex.printStackTrace();
		
					 }
			
			
			return usuarioEditar;
		
	
	}
	
	
	public boolean editarUsuario(UsuarioDTO usuarioEditar){

		
		try {

				CallableStatement cstmt = conexion.prepareCall("{ call paUpdRefaxionEditarUsuario(?,?,?,?,?,?,?,?,?,?,?,?,?)}");
		
				int i = 1;
				cstmt.setInt(i++,usuarioEditar.getIdUsuario());
				cstmt.setString(i++,usuarioEditar.getRut());
				cstmt.setString(i++,usuarioEditar.getNombre());
				cstmt.setString(i++,usuarioEditar.getApellidoPaterno());
				cstmt.setString(i++,usuarioEditar.getApellidoMaterno());
				cstmt.setString(i++,usuarioEditar.getTelefono());
				cstmt.setString(i++,usuarioEditar.getDireccion());
				cstmt.setString(i++,usuarioEditar.getFechaIngreso());
				cstmt.setString(i++,usuarioEditar.getUsuario());
				cstmt.setString(i++,usuarioEditar.getPassword());
				cstmt.setInt(i++,usuarioEditar.getIdTipoUsuario());
				cstmt.setString(i++,usuarioEditar.getEmail());
				
				
				cstmt.executeUpdate();
				cstmt.close();
				
		} catch (Exception ex) {
			throw new RuntimeException("error editar usuarios.",ex); 
		}finally {
			   
	        try{
	       	 	  conexion.close();
	       	 
	           }catch (Exception ex){
	           
	           }
	           try{
	        		conexion.close();
	           
	        	   }catch (Exception ex){      
	        	   }
       
	   	}			
				return true;
		
	}	
	
	
	///////////////////////////////////////////////////////////////////////////////////////////////
	
	public List<UsuarioDTO> obtenerTodosUsuarios(){
		
		List<UsuarioDTO> listaUsuarios = new ArrayList<UsuarioDTO>();
		ResultSet rset = null;
		try{
		
			CallableStatement cstmt = conexion.prepareCall("{ call paConListaUsuarios()}");
			
			
			rset = cstmt.executeQuery();
			UsuarioDTO usuarioEditar =  null;
			
			while (rset.next()) {
				
				
				usuarioEditar = new UsuarioDTO();
				usuarioEditar.setIdUsuario(rset.getInt("idUsuario"));
				usuarioEditar.setRut(rset.getString("rut"));
				usuarioEditar.setNombre(rset.getString("nombre"));			
				usuarioEditar.setApellidoPaterno(rset.getString("apellidoPaterno"));
				usuarioEditar.setApellidoMaterno(rset.getString("apellidoMaterno"));
				usuarioEditar.setTelefono(rset.getString("telefono"));
				usuarioEditar.setDireccion(rset.getString("direccion"));
				usuarioEditar.setFechaIngreso(rset.getString("fechaIngreso"));
				usuarioEditar.setTipoUsuarioDescripcion(rset.getString("tipoUsuarioDescripcion"));
				usuarioEditar.setUsuario(rset.getString("usuario"));
				usuarioEditar.setPassword(rset.getString("password"));

				listaUsuarios.add(usuarioEditar);	
				
			}
			cstmt.close();
		} catch (Exception ex) {
			throw new RuntimeException("error listar usuarios.",ex); 
		}finally {
			   
	        try{
	       	 	  conexion.close();
	       	 
	           }catch (Exception ex){
	           
	           }
	           try{
	        		conexion.close();
	           
	        	   }catch (Exception ex){      
	        	   }
       
	   	}	
		return listaUsuarios;
	}
	
	public List<UsuarioDTO> obtenerTodosEmpleados(){
		
		List<UsuarioDTO> listaUsuarios = new ArrayList<UsuarioDTO>();
		ResultSet rset = null;
		try{
		
			CallableStatement cstmt = conexion.prepareCall("{ call paConListaUsuariosEmpleados()}");
			
			
			rset = cstmt.executeQuery();
			UsuarioDTO usuarioEditar =  null;
			
			while (rset.next()) {
				
				
				usuarioEditar = new UsuarioDTO();
				usuarioEditar.setIdUsuario(rset.getInt("idUsuario"));
				usuarioEditar.setRut(rset.getString("rut"));
				usuarioEditar.setNombre(rset.getString("nombre"));			
				usuarioEditar.setApellidoPaterno(rset.getString("apellidoPaterno"));
				usuarioEditar.setApellidoMaterno(rset.getString("apellidoMaterno"));
				usuarioEditar.setTelefono(rset.getString("telefono"));
				usuarioEditar.setDireccion(rset.getString("direccion"));
				usuarioEditar.setFechaIngreso(rset.getString("fechaIngreso"));
				usuarioEditar.setTipoUsuarioDescripcion(rset.getString("tipoUsuarioDescripcion"));
				usuarioEditar.setUsuario(rset.getString("usuario"));
				usuarioEditar.setPassword(rset.getString("password"));

				listaUsuarios.add(usuarioEditar);	
				
			}
			cstmt.close();
		} catch (Exception ex) {
			throw new RuntimeException("error listar empleados.",ex); 
		}finally {
			   
	        try{
	       	 	  conexion.close();
	       	 
	           }catch (Exception ex){
	           
	           }
	           try{
	        		conexion.close();
	           
	        	   }catch (Exception ex){      
	        	   }
       
	   	}	
		return listaUsuarios;
	}
	
	public List<UsuarioDTO> obtenerClientesBuscados(String rutBuscado, String nombreBuscado){
		
		List<UsuarioDTO> listaClientesBuscados = new ArrayList<UsuarioDTO>();
		ResultSet rset = null;
		try{
		

			CallableStatement cstmt = conexion.prepareCall("{ call paConRefaxionClientesBuscados(?,?)}");
			
			int i = 1;
			cstmt.setString(i++,rutBuscado);
			cstmt.setString(i++,nombreBuscado);
			rset = cstmt.executeQuery();
			
			while (rset.next()) {
				
				UsuarioDTO clientesBuscados = new UsuarioDTO();
				clientesBuscados.setIdUsuario(rset.getInt("idUsuario"));
				clientesBuscados.setRut(rset.getString("rut"));
				clientesBuscados.setNombre(rset.getString("nombre"));			
				clientesBuscados.setApellidoPaterno(rset.getString("apellidoPaterno"));
				clientesBuscados.setApellidoMaterno(rset.getString("apellidoMaterno"));
				clientesBuscados.setTelefono(rset.getString("telefono"));
				clientesBuscados.setDireccion(rset.getString("direccion"));
				clientesBuscados.setFechaIngreso(rset.getString("fechaIngreso"));
				clientesBuscados.setUsuario(rset.getString("usuario"));
				clientesBuscados.setPassword(rset.getString("password"));
				clientesBuscados.setEmail(rset.getString("email"));
				
				listaClientesBuscados.add(clientesBuscados);	
				
			}
			cstmt.close();
		} catch (Exception ex) {
			throw new RuntimeException("error listar usuarios.",ex); 
		}finally {
			   
	        try{
	       	 	  conexion.close();
	       	 
	           }catch (Exception ex){
	           
	           }
	           try{
	        		conexion.close();
	           
	        	   }catch (Exception ex){      
	        	   }
       
	   	}	
		return listaClientesBuscados;
	}
	

	public Connection getConexion() {
		return conexion;
	}

	public void setConexion(Connection conexion) {
		this.conexion = conexion;
	}
	 
	 

}
